package Day19;

public class Day19 {
    public static void main(String[] args) {
        //多线程
        //线程 程序当中的单一的线性的执行流程 顺序执行的过程
        //缺点 代码之间互相牵制 前段代码走不完后段代码无法执行 类似串联
        //多线程 多个任务一起执行 每个任务就是一个线程
        //类似并联 但是无法实现真正的并联
        //编译完的代码 最终都会变成指令由CPU执行 一次只能执行一条指令
        //并发 微观上还是一个个执行 走走停停 但是速度很快 每件事只执行一点 宏观上是都在运行 形成感官欺骗 不是真正意义的并联
        //线程调度器 将要执行的任务分段 按段执行 但是不会保证平均分配执行先后顺序

        //应用场景
        //1 互不干扰的执行环境
        //2 单线程可以完成 但是多线程更快

        //摩尔规律 每18个月 集成电路上的的晶体管数量会翻一倍

        //创建并启动多线程
        //1 定义一个类继承Thread 在lang包中 不需要导包直接用

        //线程API
        //主线程 执行main方法的线程 自动启动
        //进程 操作系统级别下正在运行的程序的实例
        //进程实质上相当于程序的运行环境 并且进程之间是互相隔离的 不会互访对方的 有相应的运行设施
        //而线程就是进程中并发运行的代码 共用同一进程中的资源 线程是没有独立的内存空间的 用的都是进程的
        //进程之间是不并发的 因为不会互访 但是线程之间会争抢进程的公共资源 可能产生并发安全问题

        //阻塞 Sleep阻塞 Wait阻塞 IO阻塞
        //时间片的长短决定CPU运行此线程的时间 当线程阻塞时 调度器会强制将剩余的时间片释放并重新分配给
        //其他的线程 而被晾在一边的线程状态被称为"挂起"

        //线程优先级
        //默认为5 系统分配了1-10的优先级 数字越大优先级越高
        //在调度器处 哪个任务的优先级高 哪个任务被分配到的时间片数量越多 CPU执行次数越多

        //sleep阻塞 主动要求阻塞规定毫秒或纳秒

        //守护线程
        //通过普通线程创建的 经过setDaemon()变成守护线程
        //用户线程 前台线程
        //守护线程 后台线程
        //区别 结束时机不同 操作系统规定 一个进程中所有用户线程都结束 守护线程会强制结束 比较悲壮 同生共死
        //守护线程必须在线程启动前设置 否则会产生"非法线程状态异常"
        //守护线程不针对任何用户线程 进程的结束就一个标志 所有用户线程都结束

        //主线程main 一定是用户线程
        //误区 进程是否结束不取决于主线程是否死 main方法执行完就会死 剩余还在执行的线程会继续进行
        //若在main中加入死循环使之一直执行 那守护线程将不会因为其中剩余用户线程的死亡而死亡
        //除非main的死循环因某种条件执行完才会一同死去

        //GC 垃圾回收功能 GC就是运行在一个守护线程上的 要一直工作直到所有线程结束
    }
}
